package com.qianfeng.zookeeper.curator.wathcher;


//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼            BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  


import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.CountDownLatch;

/**
 * Created by jackiechan on 2021/7/9 15:02
 *
 * @author jackiechan
 * 请记住 2021-06-24 这个让我变成 SB 的日子
 */

public class CuratorWatcher2 {
    private static final String ZKADDR = "10.9.12.200:8601,10.9.12.200:8602,10.9.12.200:8603";
    private static CountDownLatch countDownLatch = new CountDownLatch(1);//用作阻塞的, 1 的意思是只需有一个地方执行了放行就放行所有阻塞的地方

    public static void main(String[] args) throws Exception {

        //连接 zk
        //进行操作
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString(ZKADDR).connectionTimeoutMs(5000)
                //失败后会等一秒再重试,最多重试 5 次,也就是最多连接 6 次
                .retryPolicy(new ExponentialBackoffRetry(1000, 5))//如果连接不上是否重试,如果重试怎么重试
                .build();

        curatorFramework.start();

        PathChildrenCache cache = new PathChildrenCache(curatorFramework, "/super", true);
        cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);//NOMARL     BUILD_INITIAL_CACHE在增删改的时候会提醒我们变化的东西 ,  POST_INITIALIZED_EVET只在启动和增加的时候会有提示,并且会返回所有的数据
        cache.getListenable().addListener(new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
                PathChildrenCacheEvent.Type type = event.getType();
                switch (type) {
                    case CHILD_ADDED:
                        String path = event.getData().getPath();
                        byte[] data = event.getData().getData();
                        System.err.println("添加的路径是" + path + "数据是:===>" + new String(data));
                        break;
                    case CHILD_UPDATED:
                        String path1 = event.getData().getPath();
                        byte[] data1 = event.getData().getData();
                        System.err.println("gengxin的路径是" + path1 + "数据是:===>" + new String(data1));
                        break;

                    case CHILD_REMOVED:
                        String path2 = event.getData().getPath();
                        byte[] data2 = event.getData().getData();
                        System.err.println("shanchu的路径是" + path2 + "数据是:===>" + new String(data2));
                        break;
                }
            }
        });


        curatorFramework.create().creatingParentsIfNeeded().forPath("/super/dasdasdas", "dasdas".getBytes(StandardCharsets.UTF_8));
         curatorFramework.setData().forPath("/super/dddd", "dasdasdasdasdas".getBytes(StandardCharsets.UTF_8));

        // curatorFramework.delete().deletingChildrenIfNeeded().forPath("/super");
        System.in.read();
    }
}
